{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Assembly Viewer\n",
    "Demonstrates how to parse the `assembly.json` file to construct a graph and visualize the assembly"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "from pathlib import Path\n",
    "import networkx as nx\n",
    "import numpy as np\n",
    "import trimesh\n",
    "import meshplot as mp\n",
    "\n",
    "from assembly_graph import AssemblyGraph"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Parse the Assembly into a Graph"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "assembly_dir = Path(\"path/to/a1.0.0/assembly\")\n",
    "assembly_file = assembly_dir / \"7780_6c885e81/assembly.json\"\n",
    "\n",
    "ag = AssemblyGraph(assembly_file)\n",
    "graph = ag.get_graph_networkx()\n",
    "\n",
    "label_dict = ag.get_node_label_dict()\n",
    "nx.draw_circular(graph, connectionstyle=\"arc3, rad = 0.1\", labels=label_dict, with_labels=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## View the Assembly"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "3fbe244d2a754d619171e3fb0f86bde2",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Renderer(camera=PerspectiveCamera(children=(DirectionalLight(color='white', intensity=0.6, position=(-6.794929…"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "<meshplot.Viewer.Viewer at 0x7fa7388c7e10>"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Concat all the vertices and faces together as lists\n",
    "vertices_list = []\n",
    "faces_list = []\n",
    "face_offset = 0\n",
    "for index, (node_key, node_data) in enumerate(graph.nodes.data()):\n",
    "    node_obj_file = assembly_file.parent / f\"{node_data['body_file']}.obj\"\n",
    "    mesh = trimesh.load(node_obj_file)\n",
    "    f = mesh.faces\n",
    "    v = mesh.vertices\n",
    "    faces_list.append(f + face_offset)\n",
    "    v = np.pad(v.T, ((0, 1), (0, 0)), mode=\"constant\", constant_values=1)\n",
    "    transform = np.array(node_data[\"transform\"])\n",
    "    v = transform @ v\n",
    "    vertices_list.append(v.T)\n",
    "    face_offset += v.shape[1]\n",
    "    \n",
    "vertices = np.concatenate(vertices_list)\n",
    "faces = np.concatenate(faces_list)\n",
    "# Show the combined mesh\n",
    "mp.plot(vertices[:,0:3], faces)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "interpreter": {
   "hash": "bd233d35984c509e34d87a6c4917af9a54942a0c7c6963e05834a165480a06dc"
  },
  "kernelspec": {
   "display_name": "Python 3.7.10 64-bit ('joint_env': conda)",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.10"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
